7
תגובות

JS | הצפנה זהה לPHP

פתח shlomo120 ,
אהלן .
אני בונה עכשיו מערכת העלאת תמונות אבל בAJAX כלומר הJS מטפל בהצגה של השם של התמונה , גודל וכו'

אני רוצה להציג קישור לתמונה - הקטע הוא שהקישור צריך להיות יחודי כלומר או הצפנה או זמן (date) .

האם יש פונקצייה בPHP שמצפינה שיש אותה גם בJS ?
כדי שהקישור לתמונה יהיה זהה לפרטים במסד וכו .


חיפשתי באינטרנט ומצאתי כל מיני דברים אבל הם לא עבדו .. (md5 ' base64)

7 תשובות

avatar ענה iiddaannyy ב 26 ליוני 2012 #

או להשתמש בחותמת זמן (מספר השניות מאז 1970) או לקבל עם ajax את הקישור הייחודי.

avatar ענה intval ב 26 ליוני 2012 #

אני לא ממש מבין את הקשו של ajax לנושא בחירת השם.
אתה נותן ללקוח לבחור את שם הקובץ? ומה אם הלקוח בוחר שם שכבר קיים בשרת? או מה עם הזמן של הלקוח שונה מהזמן של השרת ? בזמן העלאה השרת יקרא לקובץ בשם כלשהו וזהו.

avatar ענה shlomo120 ב 27 ליוני 2012 #

בJS יש אפשרות לשים עוגיה נכון ? אז אני עושה עוגיה עם הזמן וככה הPHP מקבל את העוגיה ומכניס אותה למסד .
וזה יהיה השם של הקובץ .

האם יש הצפנה בJS (כלומר MD5 , BASE64 וזה לא ממש משנה) שזהה לPHP ?

avatar ענה login_sucks ב 27 ליוני 2012 #

זה בעיית אבטחה מאוד רצינית! אסור בשום פנים ואופן לסמוך על מידע שמגיע מהמשתמש (עוגיות זה מידע שאין לך שליטה עליו). המערכת שלך תהיה גם פגיעה ל-SQL Injection וגם למתקפות שקשורות למערכת הקבצים. איך עובד אלגוריתם העלאת הקבצים שלך?

- iosolidar

avatar ענה cthulhu ב 27 ליוני 2012 #

אין פונקצייה מובנת, אבל תמיד אפשר לכתוב אחת משלך על פי האלגוריתם או למצוא בגוגל.

avatar ענה shlomo120 ב 27 ליוני 2012 #

יש פה גם חלק שאם אתה גורר את הקובץ מעל איזור מסויים זה מעלה אותו גם ....

זה הקוד JS שלי ...

(function() {

    var dir = "upload/";
    var domain = "http://localhost/ajax/upload/" ;

  // getElementById
  function $id(id) {
    return document.getElementById(id);
  }


  // output information
  function Output(msg) {
    var m = $id("messages");
    m.innerHTML = msg + m.innerHTML;
  }


  // file drag hover
  function FileDragHover(e) {
    e.stopPropagation();
    e.preventDefault();
    e.target.className = (e.type == "dragover" ? "hover" : "");
  }


  // file selection
  function FileSelectHandler(e) {

    // cancel event and hover styling
    FileDragHover(e);

    // fetch FileList object
    var files = e.target.files || e.dataTransfer.files;

    // process all File objects
    for (var i = 0, f; f = files[i]; i++) {
      ParseFile(f);
      UploadFile(f);
    }

  }


  // output file information
  //***************************HERE I NEED TO CREATE A NAME TO THE FILR TO SHOW IT TO THE USER************************************//
  function ParseFile(file) {
    var size = file.size /131072;
    var mbsize = Math.floor(size*100)/100 ;
    var link = domain + dir + file.name ;
    Output(
      "<p>File information: <strong>" + file.name +
      "</strong> type: <strong>" + file.type +
      "</strong> size: <strong>" + mbsize +
      "</strong> MB</p><p>link: <a href='" + link +
      "' alt=''><strong>" + link +
      "</strong></a><br />"

    );

    // display an image
    if (file.type.indexOf("image") == 0) {
      var reader = new FileReader();
      reader.onload = function(e) {
        Output(
          "<p><strong>" + file.name + ":</strong><br />" +
          '<img src="' + e.target.result + '" /></p>'
        );
      }
      reader.readAsDataURL(file);
    }

    // display text
    if (file.type.indexOf("text") == 0) {
      var reader = new FileReader();
      reader.onload = function(e) {
        Output(
          "<p><strong>" + file.name + ":</strong></p><pre>" +
          e.target.result.replace(/</g, "&lt;").replace(/>/g, "&gt;") +
          "</pre>"
        );
      }
      reader.readAsText(file);
    }

  }


  // upload JPEG files
  function UploadFile(file) {

    // following line is not necessary: prevents running on SitePoint servers
    if (location.host.indexOf("sitepointstatic") >= 0) return

    var xhr = new XMLHttpRequest();
    if (xhr.upload && file.size <= $id("MAX_FILE_SIZE").value) {
      if (file.type == "image/jpg" || file.type == "image/jpeg" || file.type == "image/png" || file.type == "image/gif"  ) {

      // create progress bar
      var o = $id("progress");
      var progress = o.appendChild(document.createElement("p"));
      progress.appendChild(document.createTextNode(dir + file.name));


      // progress bar
      xhr.upload.addEventListener("progress", function(e) {
        var pc = parseInt(100 - (e.loaded / e.total * 100));
        progress.style.backgroundPosition = pc + "% 0";
      }, false);

      // file received/failed
      xhr.onreadystatechange = function(e) {
        if (xhr.readyState == 4) {
          progress.className = (xhr.status == 200 ? "success" : "failure");
        }
      };

      // start upload
      xhr.open("POST", $id("upload").action, true);
      xhr.setRequestHeader("X_FILENAME", file.name);
      xhr.send(file);

    }

  }
}


  // initialize
  function Init() {

    var fileselect = $id("fileselect"),
      filedrag = $id("filedrag"),
      submitbutton = $id("submitbutton");

    // file select
    fileselect.addEventListener("change", FileSelectHandler, false);

    // is XHR2 available?
    var xhr = new XMLHttpRequest();
    if (xhr.upload) {

      // file drop
      filedrag.addEventListener("dragover", FileDragHover, false);
      filedrag.addEventListener("dragleave", FileDragHover, false);
      filedrag.addEventListener("drop", FileSelectHandler, false);
      filedrag.style.display = "block";

      // remove submit button
      submitbutton.style.display = "none";
    }

  }

  // call initialization file
  if (window.File && window.FileList && window.FileReader) {
    Init();
  }


})();

avatar ענה login_sucks ב 27 ליוני 2012 #

javascript זה לא חלופה לסקריפט בצד שרת. אתה עדיין צריך לעשות את כל הבדיקות הללו עם PHP. הלקוח יכול לשלוח לך האש/timestamp שכבר קיים במערכת ולעשות override לקובץ קיים וזה במקרה הטוב, במקרה הפחות טוב הוא יכול להעלות לך shell או לעשות override לקבצים רגישים. הסקריפט בצד השרת צריך לייצר את כל החלקים הרגישים כמו ID לקובץ. תקבל את הקובץ בשרת ושוב תעשה את אותם בדיקות ולאחר מכן תייצר את ההאש.

- iosolidar